﻿namespace DoNet.TenPay
{
    public interface INotifyResultBase
    {
        /// <summary>
        /// 返回状态码
        /// SUCCESS/FAIL 此字段是通信标识，非交易标识，交易是否成功需要查看result_code来判断
        /// </summary>
        string return_code { set; get; }
        /// <summary>
        /// 返回信息
        /// 返回信息，如非空，为错误原因 签名失败 参数格式校验错误
        /// </summary>
        string return_msg { set; get; }
        /// <summary>
        /// 设备号 
        /// 调用接口提交的终端设备号
        /// 微信支付分配的终端设备号
        /// </summary>
        string device_info { set; get; }
        /// <summary>
        /// 随机字符串
        /// 微信返回的随机字符串
        /// </summary>
        string nonce_str { set; get; }
        /// <summary>
        /// 签名
        /// 微信返回的签名，详见签名生成算法
        /// </summary>
        string sign { set; get; }
        /// <summary>
        /// 业务结果
        /// SUCCESS/FAIL
        /// </summary>
        string result_code { set; get; }
        /// <summary>
        /// 错误代码
        /// 详细参见错误列表
        /// </summary>
        string err_code { set; get; }
        /// <summary>
        /// 错误代码描述
        /// 错误返回的信息描述
        /// </summary>
        string err_code_des { set; get; }
        /// <summary>
        /// 商户公众账号/应用ID
        /// 调用接口提交的商户公众账号ID
        /// </summary>
        string appid { set; get; }
        /// <summary>
        /// 商户号
        /// 调用接口提交的商户号
        /// </summary>
        string mch_id { set; get; }
        /// <summary>
        /// 用户标识
        /// 用户在商户appid 下的唯一标识
        /// </summary>
        string openid { set; get; }
        /// <summary>
        /// 是否关注公众账号
        /// 用户是否关注公众账号，仅在公众账号类型支付有效，取值范围：Y或N;Y-关注;N-未关注
        /// </summary>
        string is_subscribe { set; get; }
        /// <summary>
        /// 交易类型
        /// JSAPI、NATIVE、APP、MWEB
        /// </summary>
        string trade_type { set; get; }
        /// <summary>
        /// 付款银行
        /// 银行类型，采用字符串类型的银行标识，值列表详见银行类型
        /// </summary>
        string bank_type { set; get; }
        /// <summary>
        /// 总金额
        /// 订单总金额，单位为分，只能为整数，详见支付金额
        /// </summary>
        int total_fee { set; get; }
        /// <summary>
        /// 货币种类
        /// 符合ISO 4217标准的三位字母代码，默认人民币：CNY，其他值列表详见货币类型
        /// </summary>
        string fee_type { set; get; }
        /// <summary>
        /// 现金支付币种
        /// 符合ISO 4217标准的三位字母代码，默认人民币：CNY，其他值列表详见货币类型
        /// </summary>
        string cash_fee_type { set; get; }
        /// <summary>
        /// 现金支付金额
        /// 订单现金支付金额，详见支付金额
        /// </summary>
        int cash_fee { set; get; }
        /// <summary>
        /// 应结订单金额
        /// 当订单使用了免充值型优惠券后返回该参数，应结订单金额=订单金额-免充值优惠券金额。
        /// </summary>
        int settlement_total_fee { set; get; }
        /// <summary>
        /// 代金券金额
        /// “代金券”金额<=订单金额，订单金额-“代金券”金额=现金支付金额，详见支付金额
        /// </summary>
        string coupon_fee { set; get; }
        /// <summary>
        /// 代金券使用数量
        /// 代金券或立减优惠使用数量
        /// </summary>
        int coupon_count { set; get; }
        /// <summary>
        /// 微信支付订单号
        /// </summary>
        string transaction_id { set; get; }
        /// <summary>
        /// 商户订单号
        /// 商户系统内部订单号，要求32个字符内（最少6个字符），只能是数字、大小写字母_-|*且在同一个商户号下唯一。详见商户订单号
        /// </summary>
        string out_trade_no { set; get; }
        /// <summary>
        /// 商家数据包
        /// 商家数据包，原样返回
        /// </summary>
        string attach { set; get; }
        /// <summary>
        /// 支付完成时间
        /// 商家数据包，原样返回
        /// 订单生成时间，格式为yyyyMMddHHmmss，如2009年12月25日9点10分10秒表示为20091225091010。详见时间规则
        /// </summary>
        string time_end { set; get; }
    }
    public class NotifyResultBase : ResponseReturnSuccess, INotifyResultBase
    {
        /// <summary>
        /// 商户公众账号/应用ID
        /// 调用接口提交的商户公众账号ID
        /// </summary>
        public string appid { set; get; }
        /// <summary>
        /// 商户号
        /// 调用接口提交的商户号
        /// </summary>
        public string mch_id { set; get; }
        /// <summary>
        /// 用户标识
        /// 用户在商户appid 下的唯一标识
        /// </summary>
        public string openid { set; get; }
        /// <summary>
        /// 是否关注公众账号
        /// 用户是否关注公众账号，仅在公众账号类型支付有效，取值范围：Y或N;Y-关注;N-未关注
        /// </summary>
        public string is_subscribe { set; get; }
        /// <summary>
        /// 交易类型
        /// JSAPI、NATIVE、APP、MWEB
        /// </summary>
        public string trade_type { set; get; }
        /// <summary>
        /// 付款银行
        /// 银行类型，采用字符串类型的银行标识，值列表详见银行类型
        /// </summary>
        public string bank_type { set; get; }
        /// <summary>
        /// 总金额
        /// 订单总金额，单位为分，只能为整数，详见支付金额
        /// </summary>
        public int total_fee { set; get; }
        /// <summary>
        /// 货币种类
        /// 符合ISO 4217标准的三位字母代码，默认人民币：CNY，其他值列表详见货币类型
        /// </summary>
        public string fee_type { set; get; }
        /// <summary>
        /// 现金支付币种
        /// 符合ISO 4217标准的三位字母代码，默认人民币：CNY，其他值列表详见货币类型
        /// </summary>
        public string cash_fee_type { set; get; }
        /// <summary>
        /// 现金支付金额
        /// 订单现金支付金额，详见支付金额
        /// </summary>
        public int cash_fee { set; get; }
        /// <summary>
        /// 应结订单金额
        /// 当订单使用了免充值型优惠券后返回该参数，应结订单金额=订单金额-免充值优惠券金额。
        /// </summary>
        public int settlement_total_fee { set; get; }
        /// <summary>
        /// 代金券金额
        /// “代金券”金额<=订单金额，订单金额-“代金券”金额=现金支付金额，详见支付金额
        /// </summary>
        public string coupon_fee { set; get; }
        /// <summary>
        /// 代金券使用数量
        /// 代金券或立减优惠使用数量
        /// </summary>
        public int coupon_count { set; get; }
        /// <summary>
        /// 微信支付订单号
        /// </summary>
        public string transaction_id { set; get; }
        /// <summary>
        /// 商户订单号
        /// 商户系统内部订单号，要求32个字符内（最少6个字符），只能是数字、大小写字母_-|*且在同一个商户号下唯一。详见商户订单号
        /// </summary>
        public string out_trade_no { set; get; }
        /// <summary>
        /// 商家数据包
        /// 商家数据包，原样返回
        /// </summary>
        public string attach { set; get; }
        /// <summary>
        /// 支付完成时间
        /// 商家数据包，原样返回
        /// 订单生成时间，格式为yyyyMMddHHmmss，如2009年12月25日9点10分10秒表示为20091225091010。详见时间规则
        /// </summary>
        public string time_end { set; get; }
    }

    /// <summary>
    /// 订单返回结果（商户）
    /// </summary>
    public class ResponseNotifyResult : NotifyResultBase
    {
        /*
        代金券类型	coupon_type_$n	否	coupon_type_$n	否	coupon_type_$n	否	coupon_type_$n	否	coupon_type_$n	否	int	"CASH--充值代金券
        NO_CASH---非充值代金券
        并且订单使用了免充值券后有返回（取值：CASH、NO_CASH）。$n为下标,从0开始编号，举例：coupon_type_$0
        注意：只有下单时订单使用了优惠，回调通知才会返回券信息。
        下列情况可能导致订单不可以享受优惠：可能情况。"
        代金券ID	coupon_type_$n	否	coupon_type_$n	否	coupon_type_$n	否	coupon_type_$n	否	coupon_type_$n	否	String(20)	"代金券ID,$n为下标，从0开始编号
        注意：只有下单时订单使用了优惠，回调通知才会返回券信息。
        下列情况可能导致订单不可以享受优惠：可能情况。"
        单个代金券支付金额	coupon_fee_$n	否	coupon_fee_$n	否	coupon_fee_$n	否	coupon_fee_$n	否	coupon_fee_$n	否	int	单个代金券支付金额,$n为下标，从0开始编号
        */
    }
    /// <summary>
    /// 订单返回结果（服务商）
    /// </summary>
    public class ResponseNotifyResultSp : NotifyResultBase
    {
        /// <summary>
        /// 子商户公众账号/应用ID
        /// 调用接口提交的子商户公众账号ID
        /// </summary>
        public string sub_appid { set; get; }
        /// <summary>
        /// 子商户号
        /// 调用接口提交的子商户号
        /// </summary>
        public string sub_mch_id { set; get; }
        /// <summary>
        /// 用户子标识
        /// 子商户appid下用户唯一标识，如需返回则请求时需要传sub_appid
        /// </summary>
        public string sub_openid { set; get; }
        /// <summary>
        /// 是否关注子公众账号
        /// 用户是否关注子公众账号，仅在公众账号类型支付有效，取值范围：Y或N;Y-关注;N-未关注
        /// </summary>
        public string sub_is_subscribe { set; get; }

        /*
        代金券类型	coupon_type_$n	否	coupon_type_$n	否	coupon_type_$n	否	coupon_type_$n	否	coupon_type_$n	否	int	"CASH--充值代金券
        NO_CASH---非充值代金券
        并且订单使用了免充值券后有返回（取值：CASH、NO_CASH）。$n为下标,从0开始编号，举例：coupon_type_$0
        注意：只有下单时订单使用了优惠，回调通知才会返回券信息。
        下列情况可能导致订单不可以享受优惠：可能情况。"
        代金券ID	coupon_type_$n	否	coupon_type_$n	否	coupon_type_$n	否	coupon_type_$n	否	coupon_type_$n	否	String(20)	"代金券ID,$n为下标，从0开始编号
        注意：只有下单时订单使用了优惠，回调通知才会返回券信息。
        下列情况可能导致订单不可以享受优惠：可能情况。"
        单个代金券支付金额	coupon_fee_$n	否	coupon_fee_$n	否	coupon_fee_$n	否	coupon_fee_$n	否	coupon_fee_$n	否	int	单个代金券支付金额,$n为下标，从0开始编号
        */
    }
}
